home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 141 (1990-08-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 141 (1990-08-15)(Ossowski, Stefan)(DE)(PD).adf / FME / FME.asm < prev    next >
Assembly Source File  |  1990-05-15  |  9KB  |  277 lines

  1. *** FME.asm - FastMemEmulator V1.0 - © 30.09.1989 by Holger Lubitz
  2. ***
  3. *** Patcht die AllocMem()-Routine so, daß keine explizite Anforderung von
  4. *** FastMem mehr möglich ist, wenn nicht gleichzeitig das MEMF_LARGEST-Bit
  5. *** gesetzt ist. Bei bereits installiertem Patch wird dieser entfernt.
  6. ***
  7. *** Sinn der Sache ist, an sich interessante Programme wie Evolution (Fish
  8. *** 239) oder Crud, Demon und Life (alle Fish 249), die sich aber aus
  9. *** unerfindlichen Gründen nicht ohne FastMem zufriedengeben, auch auf
  10. *** Amigas ohne FastMem (512k oder 1MB mit Fatter Agnus) zum Laufen zu
  11. *** bringen, ohne in den Programmen selbst herumpatchen zu müssen.
  12. ***
  13. *** Von der Benutzung dieses Programms auf Amigas MIT FastMemory wird
  14. *** vorsorglich abgeraten ! (Auch wenn es normalerweise nichts schaden
  15. *** dürfte, aber sicher ist sicher)
  16. ***
  17. *** Quellen: A68k von Fish 186, BLink von Fish 110, small.lib von Fish 92
  18. ***
  19. *** 1> A68k FME.asm
  20. *** 1> BLink FME.o small.lib to FME
  21. ***
  22. *** FME ist zuerst im AmigaJUICE 17 (November 1989) erschienen.
  23. *** Die jeweils neueste AmigaJUICE-Ausgabe gibts gegen Einsendung einer
  24. *** Leerdiskette mit frankiertem Rückumschlag (1,70 DM Porto) bei:
  25. *** AmigaJUICE, c/o Holger Lubitz, Postfach 1431, 3070 Nienburg/Weser
  26. ***
  27. *** FME darf frei kopiert werden, wenn das Programm zusammen mit dem Source
  28. *** und unverändert weiterkopiert wird. (diese Vermerke müssen drinbleiben !)
  29. ***
  30. *** P.S.: 380 Bytes für dieses Programm sind ziemlich kurz, oder ?
  31. ***       An alle: Lernt Assembler, wenn ihr den Amiga WIRKLICH effizient
  32. ***       programmieren wollt !!
  33.  
  34.    XREF     _LVOAllocMem
  35.    XREF     _LVOClose
  36.    XREF     _LVOCloseLibrary
  37.    XREF     _LVODelay
  38.    XREF     _LVOForbid
  39.    XREF     _LVOFindTask
  40.    XREF     _LVOFreeMem
  41.    XREF     _LVOGetMsg
  42.    XREF     _LVOOldOpenLibrary
  43.    XREF     _LVOOpen
  44.    XREF     _LVOOutput
  45.    XREF     _LVOPermit
  46.    XREF     _LVOReplyMsg
  47.    XREF     _LVOSetFunction
  48.    XREF     _LVOWaitPort
  49.    XREF     _LVOWrite
  50.  
  51. _AbsExecBase = 4
  52. ThisTask     = 276
  53. pr_CLI       = $ac
  54. pr_MsgPort   = $5c
  55. MODE_OLDFILE = 1005
  56.  
  57.    SECTION "",CODE
  58.  
  59. *** Registerbelegung: A6 reserviert für Exec-Base
  60. ***                   A5 reserviert für Adresse der Taskstruktur
  61. ***                   A4 reserviert für DOS-Base
  62. ***                   A3 reserviert für Adresse des Speicherblocks
  63. ***                   D7 reserviert für Länge des Speicherblocks
  64. ***                   D6 reserviert für Fenster-Handle
  65.  
  66. *** Eigenen Task finden
  67.  
  68.    move.l   _AbsExecBase,a6         ; Exec-Basisadresse
  69.    move.l   ThisTask(a6),a5         ; FindTask(0) - Thanxx Fridtjof
  70.  
  71. *** DOS-Library öffnen
  72.  
  73.    lea      dosname(pc),a1          ; Zeiger auf 'dos.library'
  74.    jsr      _LVOOldOpenLibrary(a6)  ; Version ist egal
  75.    move.l   d0,a4                   ; Basisadresse in A4
  76.                                     ; Kein Test !
  77.                                     ; Ohne dos.library sind wir eh schon kurz
  78.                                     ; vorm Absturz :-)
  79.                                     ; Übrigens: DOS ist die EINZIGE Library,
  80.                                     ; die ihre Basisadresse beim Aufruf NICHT
  81.                                     ; in A6 braucht (BCPL's einziger Vorteil)
  82.  
  83. *** Test auf Workbench oder CLI
  84.  
  85.    tst.l    pr_CLI(a5)              ; Sind wir vom CLI aus gestartet worden ?
  86.    beq.s    WB                      ; Wenn nicht dann zum WB-Startup
  87.  
  88. *** CLI-Startup
  89.  
  90. CLI
  91.    jsr      _LVOOutput(a4)          ; Handle des CLI-Fensters
  92.    move.l   d0,d6                   ; in D6
  93.    bra.s    main                 ; und zum Start des Patches
  94.  
  95. *** WB-Startup
  96.  
  97. WB
  98.    lea.l    pr_MsgPort(a5),a0       ; Sonst auf die Message warten
  99.    jsr      _LVOWaitPort(a6)        ; die die Workbench sendet
  100.    jsr      _LVOGetMsg(a6)          ; Sie ist da, wie schön !
  101.    move.l   d0,-(a7)                ; Zeiger auf Message sichern
  102.    lea      fenster(pc),a0          ; Zeiger auf Fenstertitel
  103.    move.l   a0,d1                   ; in D1
  104.    move.l   #MODE_OLDFILE,d2        ; CON: sollte es schon geben
  105.    jsr      _LVOOpen(a4)            ; öffnen
  106.    tst.l    d0                      ; hats geklappt ?
  107.    beq.s    wbexit                  ; sonst hats keinen Zweck
  108.    move.l   d0,d6                   ; Fenster-Handle in D6 sichern
  109.  
  110. main
  111.  
  112. *** Länge des Patches ermitteln und in D7 speichern
  113.  
  114.    moveq    #endpatch-startpatch,d7 ; Länge unseres Patches
  115.  
  116. *** Testen, ob wir schon installiert sind
  117.  
  118.    move.l   _LVOAllocMem+2(a6),a3   ; Anfangsadresse AllocMem()
  119.    move.l   startpatch(pc),a0       ; Start unseres Patches
  120.    cmp.l    (a3),a0                 ; sind wir schon da ?
  121.    beq.s    remove                  ; dann entfernen
  122.  
  123. *** Speicher für den Patch reservieren
  124.  
  125.    move.l   d7,d0                   ; Länge in D0
  126.    moveq    #0,d1                   ; keine besonderen Anforderungen
  127.    jsr      _LVOAllocMem(a6)        ; Speicher belegen
  128.  
  129. *** Speicher bekommen ?
  130.  
  131.    tst.l    d0                      ; Enthält D0 eine Startadresse ?
  132.    beq.s    fehler                  ; bei 0 haben wir keinen Speicher bekommen
  133.                                     ; TEST! Speicheranforderungen müssen
  134.                                     ; immer getestet werden, auch wenn das
  135.                                     ; System lumpige 16 Bytes eigentlich
  136.                                     ; finden sollte.
  137.  
  138. *** Startadresse in A3 zwischenspeichern
  139.  
  140.    move.l   d0,a3                   ; Adressen immer in Adressregister !
  141.                                     ; außerdem brauchen wirs noch als Basis
  142.                                     ; (schau mal ein paar Zeilen tiefer)
  143.  
  144. *** Den Patch kopieren
  145.  
  146.    lea      startpatch(pc),a0       ; Startadresse des Patches in A0
  147.    move.l   a3,a1                   ; Start reservierter Speicher in A1
  148.    subq     #1,d7                   ; weil DBRA-Loop
  149. copyloop                            ; Kopierschleife
  150.    move.b   (a0)+,(a1)+             ; byteweise kopieren
  151.    dbra     d7,copyloop             ; weil in D7 die Länge in Bytes steht
  152.  
  153. *** Korrekten ROM-Einsprung für AllocMem in Patch nachtragen
  154.  
  155.    move.l   _LVOAllocMem+2(a6),allocmem-startpatch+2(a3)
  156.  
  157. *** AllocMem() umpatchen
  158.  
  159.    move.l   a3,d0                   ; Startadresse des Patches
  160.    bsr.s    patch
  161.  
  162. *** Installed-Text ausgeben
  163.  
  164.    lea      text1(pc),a0            ; Text-Adresse nach A0
  165.    moveq    #text1e-text1,d3        ; Länge in D3
  166.    bsr.s    schreibe
  167.  
  168. *** und aufräumen
  169.  
  170.    bra.s    cleanup
  171.  
  172. *** Hier wird der Patch wieder entfernt
  173.  
  174. remove
  175.    move.l   allocmem-startpatch+2(a3),d0 ; originalen AllocMem-Einsprung holen
  176.    bsr.s    patch
  177.  
  178. *** und der Speicher wieder freigegeben
  179.  
  180.    move.l   d7,d0                   ; Länge in D0
  181.    move.l   a3,a1                   ; Startadresse in A1
  182.    jsr      _LVOFreeMem(a6)         ; D0 Bytes ab A1 freigeben
  183.  
  184. *** Removed-Text ausgeben
  185.  
  186.    lea      text2(pc),a0
  187.    moveq    #text2e-text2,d3
  188.    bsr.s    schreibe
  189.    bra.s    cleanup
  190.  
  191. *** Fehler-Text ausgeben
  192.  
  193. fehler
  194.    lea      text3(pc),a0
  195.    moveq    #text3e-text3,d3
  196.    bsr.s    schreibe
  197.  
  198. *** Falls vom CLI gestartet, sind wir fast fertig
  199.  
  200. cleanup
  201.    tst.l    pr_CLI(a5)              ; war es das CLI ?
  202.    bne.s    closelib                ; dann dos.library schließen
  203.  
  204. *** Sonst haben wir noch ein bißchen zu tun (WB-Cleanup)
  205.  
  206. *** Fenster schließen
  207.  
  208.    move.l   #150,d1                 ; 150/50 (also 3) Sekunden
  209.    jsr      _LVODelay(a4)           ; warten (damit mans auch lesen kann)
  210.    move.l   d6,d1                   ; Fenster
  211.    jsr      _LVOClose(a4)           ; schließen
  212. wbexit
  213.    bsr.s    closelib                ; dos-lib schließen
  214.  
  215. *** Msg beantworten
  216.  
  217.    jsr      _LVOForbid(a6)          ; Wir wollen nicht zu früh von der WB
  218.                                     ; rausgeschmissen werden
  219.    move.l   (a7)+,a1                ; Die gesicherte msg nach A1
  220.    jmp      _LVOReplyMsg(a6)        ; und endlich antworten
  221.  
  222. *** DOS-Lib schließen (erwartet DOSBase in A4 und Exec-Base in A6)
  223.  
  224. closelib
  225.    move.l   a4,a1                   ; Dos-Base nach A1
  226.    jmp      _LVOCloseLibrary(a6)    ; schließen
  227.  
  228. *** Die Routine zum Patchen von AllocMem() in der Exec-Sprungleiste
  229. *** wird zweifach aufgerufen, steht darum hier.
  230.  
  231. patch
  232.    jsr      _LVOForbid(a6)          ; Multitasking aus (sicher ist sicher)
  233.    move.l   #_LVOAllocMem,a0        ; Offset von AllocMem
  234.    move.l   a6,a1                   ; gepatcht wird in Exec
  235.    jsr      _LVOSetFunction(a6)     ; und ändern.
  236.    jmp      _LVOPermit(a6)          ; Multitasking wieder erlauben
  237.  
  238. *** Text ausgeben (a0 und d3 müssen Adresse und Länge enthalten)
  239.  
  240. schreibe
  241.    move.l   d6,d1
  242.    move.l   a0,d2
  243.    jmp      _LVOWrite(a4)
  244.  
  245. *** Hier beginnt der eigentliche Patch
  246.  
  247. startpatch            ; Label für Patch-Startadresse
  248.    btst     #17,d1    ; MEMF_LARGEST-Bit testen
  249.    bne.s    allocmem  ; Bei soviel Hunger MEMF_FAST lieber nicht löschen
  250.                       ; (für Kompatibilität mit etlichen NOFASTMEM-Programmen)
  251.    bclr     #2,d1     ; sonst MEMF_FAST-Bit löschen
  252. allocmem
  253.    jmp      $12345678 ; diese Adresse wird erst in der Patch-Kopie angepaßt
  254.                       ; (sonst wäre FME nicht resident-fähig)
  255. endpatch              ; dient zur Längenermittlung des Patches
  256.  
  257. *** Dies ist die Text-Sektion
  258.  
  259. dosname
  260.    dc.b     "dos.library",0
  261. fenster
  262.    dc.b     "CON:10/10/320/80/HAL's FastMemEmulator",0
  263.  
  264. text1
  265.    dc.b     "Patch installiert",10
  266. text1e
  267.  
  268. text2
  269.    dc.b     "Patch entfernt",10
  270. text2e
  271.  
  272. text3
  273.    dc.b     "Kein Speicher",10
  274. text3e
  275.  
  276.    END
  277.